package heap;

import java.util.*;

/**
 * 前 K 个高频元素
 */
public class KHighFrequencyEle {
    class Freq implements Comparable<Freq> {
        int num;
        int time;

        public Freq(int num, int time) {
            this.num = num;
            this.time = time;
        }


        @Override
        public int compareTo(Freq o) {
            return this.time - o.time;
        }
    }
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            map.put(num, map.getOrDefault(num, 1) + 1);
        }
//        Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return map.get(o1) - map.get(o2);
//            }
//        });
//        for (int num : map.keySet()) {
//            queue.offer(num);
//            if (queue.size() > k) {
//                queue.poll();
//            }
//        }
//        int[] ret = new int[k];
//        for (int i = 0; i < k && !queue.isEmpty(); i++) {
//            ret[i] = queue.poll();
//        }
//        return ret;

        // 使用内部类
        Queue<Freq> queue = new PriorityQueue<>();
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            queue.offer(new Freq(entry.getKey(), entry.getValue()));
            if (queue.size() > k) {
                queue.poll();
            }
        }
        int[] ret = new int[k];
        for (int i = 0; i < k && !queue.isEmpty(); i++) {
            ret[i] = queue.poll().num;
        }
        return ret;
    }
}
